Functies die zichzelf wijzigen
Home

Functies die zichzelf wijzigen

Functies die zichzelf wijzigen

Functies zijn data en kunnen dus aan zichzelf een andere waarde (functie) toekennen. Nogmaals, functies zijn gewoon data die zijn opgeslagen in een variabele. Dus kan je de code van een functie in JavaScript aanpassen tijdens de uitvoering ervan.

Scenario

Afhankelijk van welke gebruiker de website bezoekt moet de functie de mogelijkheden tonen van een admin of van een gewone bezoeker. We kunnen dit als volgt doen:

var user = 'Jef';
authorization = function() {
  if (user == 'Jef')  {
    // hier schrijf je nuttiger dingen om te doen
    // maar dit is een voorbeeld
    return 'admin';
  }
  else   { 
    return 'bezoeker';
  }
}
console.log(user, ' is ', authorization());

Deze functie moet rekening houden met de mogelijkheid dat gebruikers met verschillende rechten de website bezoeken. We weten dat één keer de website geladen is, de bezoeker niet meer wijzigt. Toch wordt telkens als die methode wordt uitgevoerd nagekenen wie de bezoeker is. We kunnen dat vereenvoudigen en efficiënter maken door de functie zichzelf te laten wijzigen afhankelijk van wie de bezoeker is. En dat hoeft slechts eenmaal te gebeuren:

var user = 'Jef';
var authorizationSelfModified = function() {
  if (user == 'Jef')  {
    // hier schrijf je nuttiger dingen om te doen
    // maar dit is een voorbeeld
    authorizationSelfModified = function() {return 'admin';};
  }
  else   { 
    authorizationSelfModified = function() {return 'bezoeker';};
  }
};

// de eerste keer roep je die op om de functie
// de wijzigen afhankelijk van wij aangemeld is
console.log(user, ' is ', authorizationSelfModified());
console.log(user, ' is ', authorizationSelfModified());

See the Pen Zichzelf wijzigende functie by Jef Inghelbrecht (@jef) on CodePen.

Zichzelf wijzigende code

We beginnen met het declareren van een functie:

voorbeeld = function() {
  var tekst = 'eerste versie';
  return tekst;
};
console.log(voorbeeld());

Een functie is een object. Maar kunnen er een stringrepresentatie van maken met de toString methode:

var tekst = voorbeeld.toString();

Vervolgens vervangen we de tekst 'eerste' door 'tweede':

var tekst2 = tekst.replace('eerste', 'tweede');
console.log(tekst2);

We maken een nieuw functie-object met de Function constructor. We knippen eerste de tekst function() weg. Sommige browsers plaatsen een spatie tussen het keyword function en de ronde haken. Dus we zorgen ervoor dat ook deze schrijfwijze verwijderd wordt:

voorbeeld2 = new Function(tekst2.
       replace("function()","")
             .replace("function ()",""));
console.log(voorbeeld2());

Is dat iets wat je moet toepassen? Beter niet. Ik vermeld dat alleen om te tonen dat functions in JavaScript data zijn. Hieronder zien we een zinvoller manier om die mogelijkheid toe te passen.

JI
2016-10-05 14:18:16